package org.example.maven.utils.excel;

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.DateUtil;
import org.example.maven.utils.ExcelUtils;
import org.apache.poi.ss.usermodel.Cell;
import java.time.LocalDate;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class ExcelDateUtils {
    // 定义日期格式 (支持 1956/7/12 和 1956-07-12 等格式)
    private static final DateTimeFormatter[] DATE_FORMATTERS = {
            DateTimeFormatter.ofPattern("yyyy/M/d"),
            DateTimeFormatter.ofPattern("yyyy-M-d"),
            DateTimeFormatter.ofPattern("M/d/yyyy") // 可选支持其他格式
    };

    /**
     * 将Excel单元格转换为LocalDate
     * @param cell Excel单元格
     * @return 解析后的日期，解析失败返回null
     */
    public static LocalDate getCellLocalDateValue(Cell cell) {
        if (cell == null) return null;

        try {
            // 场景1：单元格是Excel日期格式（数值型）
            if (cell.getCellType() == CellType.NUMERIC && DateUtil.isCellDateFormatted(cell)) {
                return cell.getDateCellValue().toInstant()
                        .atZone(ZoneId.systemDefault())
                        .toLocalDate();
            }

            // 场景2：单元格是字符串格式（如 "1956/7/12"）
            String dateString = ExcelUtils.getCellStringValue(cell).trim();

            // 尝试多种格式解析
            for (DateTimeFormatter formatter : DATE_FORMATTERS) {
                try {
                    return LocalDate.parse(dateString, formatter);
                } catch (DateTimeParseException ignored) {}
            }

            // 所有格式尝试失败
            throw new DateTimeParseException(
                    "无法解析日期格式",
                    dateString,
                    cell.getRow().getRowNum() // 记录错误行号
            );

        } catch (Exception e) {
            // 记录错误日志（包含单元格位置）
            String errorMsg = String.format(
                    "日期解析失败 [行:%d 列:%d] 值:'%s'",
                    cell.getRow().getRowNum() + 1,
                    cell.getColumnIndex() + 1,
                    ExcelUtils.getCellStringValue(cell)
            );
            throw new IllegalArgumentException(errorMsg, e);
        }
    }
}
